package org.pictual.action;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.pictual.business.vo.CompletoVO;
import org.pictual.business.vo.DefinicionVO;
import org.pictual.business.vo.IdiomaVO;
import org.pictual.business.vo.ImagenVO;
import org.pictual.business.vo.PalabraVO;
import org.pictual.controller.GoogleSearchImg;
import org.pictual.controller.MyImage;
import org.pictual.service.PictualDelegateFactory;
import org.pictual.util.PalabraEnTabla;
import org.pictual.util.RequestKeys;
import org.pictual.util.SessionKeys;

public class AddImagesAction extends Action{

	
	protected static Logger log= Logger.getLogger(AddImagesAction.class);
	private ImagenVO[] imagenes = new ImagenVO[6];
	
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		long t1 = System.currentTimeMillis();
		ServletContext context = getServlet().getServletContext();
		HttpSession sesion= request.getSession();
		
		ArrayList<PalabraEnTabla> listadoPalabras = (ArrayList<PalabraEnTabla>) sesion.getAttribute(SessionKeys.WORDS);
		
//		if((listadoPalabras==null)||(listadoPalabras.isEmpty()) ){

		if(request.getParameter("words")!=null){
//			log.info("Sesion vacia, miramos en request");
			String[] words;
			
			words = request.getParameter("words").split("\n");
			String langLeft = request.getParameter(RequestKeys.FROM);
			String langRight = request.getParameter(RequestKeys.TO);
			
			listadoPalabras = new ArrayList<PalabraEnTabla>();
			int idPalabara;
			for(String word: words){

				idPalabara=PictualDelegateFactory.getIdiomaDelegate().selectIdPalabra(word.trim());
//				System.out.println("--------------"+idPalabara+"-------------");
				
				boolean haveImages = PictualDelegateFactory.getPalabraDelegate().haveImages(idPalabara);
				
				if(!haveImages)listadoPalabras.add(new PalabraEnTabla(word.trim(), langLeft, langRight, haveImages, idPalabara));
			}
		}
		
		List<PalabraEnTabla> listaPalabras = new ArrayList<PalabraEnTabla>();
		
		for(PalabraEnTabla pet: listadoPalabras){
			if(!pet.isImagenes()){
//				System.out.println("!!!!!!!! "+pet.getWord()+" !!!!!!!!!!!");
				findImages(pet.getWord(), pet.getIdioma_origen());
				int palabra_id = pet.getId();
				PalabraVO palabraVO = new PalabraVO();
				palabraVO.setPalabra_id(palabra_id);
				
				int idioma = 0, wiki = 0;
				if(pet.getIdioma_origen().equals("en")) idioma=1;
				if(pet.getIdioma_origen().equals("es")) idioma=2;
				if(pet.getIdioma_origen().equals("de")) idioma=3;
				if(pet.getIdioma_origen().equals("fr")) idioma=4;
				
				if(pet.getIdioma_diccionario().equals("en")) wiki=1;
				if(pet.getIdioma_diccionario().equals("es")) wiki=2;
				if(pet.getIdioma_diccionario().equals("de")) wiki=3;
				if(pet.getIdioma_diccionario().equals("fr")) wiki=4;
				
				CompletoVO completo = PictualDelegateFactory.getIdiomaDelegate().selectPalabraCompleta(pet.getWord(), idioma, wiki);

				DefinicionVO definicionVO = PictualDelegateFactory.getDefinicionDelegate().readDefinicion(palabra_id, idioma, wiki);
				
				IdiomaVO idiomaVO = PictualDelegateFactory.getIdiomaDelegate().readIdioma(pet.getWord(), idioma);
				
				palabraVO = PictualDelegateFactory.getPalabraDelegate().readPalabra(palabra_id);

				
				if(completo!=null){
					insertInDatabase(palabraVO);
					pet.setImagenes(true);
					
//					//CACHE
//					Cache <String, CompletoVO> cache = (Cache<String, CompletoVO>) context.getAttribute("cache");
//					String cadenaParaCache = completo.getPalabra()+"/"+completo.getIdioma()+"/"+completo.getWiki();
//					
//					if(cache == null){
//						log.info("CACHE: No existe cache. Se crea");
//						cache = new Cache<String, CompletoVO>(100);
//						context.setAttribute("cache", cache);
//					}
//					log.info("CACHE: Clave de cache: "+cadenaParaCache);
//					
//					CompletoVO palabraEnCache = cache.get(cadenaParaCache);
//					if (palabraEnCache == null) {
//						log.info("CACHE: No esta en cache");
//						palabraEnCache=new CompletoVO();
//						
//						
//						imagenes[0] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_1());
//						imagenes[1] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_2());
//						imagenes[2] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_3());
//						imagenes[3] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_4());
//						imagenes[4] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_5());
//						imagenes[5] = PictualDelegateFactory.getImagenDelegate().readImagen(palabraVO.getImagen_6());
//						
//
//						palabraEnCache.setIdiomaVO(idiomaVO);
//						palabraEnCache.setDefinicionVO(definicionVO);
//						palabraEnCache.setPalabraVO(palabraVO);
//						palabraEnCache.setImagenes(imagenes);
//						
//						cache.put(cadenaParaCache, palabraEnCache);
//						
//					}else{
//						log.info("CACHE: Esta en cache");
//						cache.put(cadenaParaCache, palabraEnCache);
//						
//					}
//					//FIN CACHE
				}
				else log.info("No se insertan las imagenes en base de datos porque no existe la palabra");
				
			}else log.info("La palabra ya tiene imagenes");
			
			
			listaPalabras.add(pet);
		}
		
		sesion.setAttribute(SessionKeys.WORDS, listaPalabras);
		
		
		//Obtengo en sesion un listado de palabras
		//Las recorro.
		//para cada una SI ESTA EN BD busco sus imagenes, las subo al ftp y las guardo en un array
		//subo esas imagenes a BD
		//modifico la tabla palabra para esa palabra con esas imagenes
		
		
		long t2 = System.currentTimeMillis();
		long t = (t2 - t1)/1000; // en segundos
		log.info("***timeSearchMasivaImg: LA BUSQUEDA masiva TARDA " + t + " SEGUNDOS");
		return mapping.findForward("success");
	}
	
	public void findImages(String query, String idioma){
		Vector<MyImage> images = null;
		imagenes = new ImagenVO[6];
		log.info("descargando imagenes");
		images = GoogleSearchImg.queryForImages(query, idioma);
		int i=0;
		for(MyImage img: images){
			log.info("imagen encontrada");
			imagenes[i]=new ImagenVO();
			imagenes[i].setHeight(img.getHeight());
			imagenes[i].setWidth(img.getWidth());
			imagenes[i].setPath_big(img.getImgLink());
			imagenes[i].setPath_small(img.getImgThumbnail());
			imagenes[i].setPath_original(img.getImgRef());
			log.info(i+": "+imagenes[i].getPath_big());
			i++;
		}
	}
	
	public void insertInDatabase(PalabraVO palabraVO){
		for(ImagenVO img: imagenes){
			if(img!=null) PictualDelegateFactory.getImagenDelegate().insertImagen(img);
		}
		if(imagenes[0]!=null) palabraVO.setImagen_1(imagenes[0].getImagen_id());
		if(imagenes[1]!=null) palabraVO.setImagen_2(imagenes[1].getImagen_id());
		if(imagenes[2]!=null) palabraVO.setImagen_3(imagenes[2].getImagen_id());
		if(imagenes[3]!=null) palabraVO.setImagen_4(imagenes[3].getImagen_id());
		if(imagenes[4]!=null) palabraVO.setImagen_5(imagenes[4].getImagen_id());
		if(imagenes[5]!=null) palabraVO.setImagen_6(imagenes[5].getImagen_id());
		
		//Actualizo la palabra con las imagenes nuevas
		PictualDelegateFactory.getPalabraDelegate().updatePalabra(palabraVO);
		
//		System.out.println("*******************************************************************************************");
//		System.out.println(palabraVO);
	}
}
